我的Bilibili频道:香芋派Taro
我的个人博客:taropie0224.github.io(阅读体验更佳)
我的公众号:香芋派的烘焙坊
我的音频技术交流群:1136403177
我的个人微信:JazzyTaroPie

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution
{
public:
int removeDuplicates(vector<int> &nums)
{
int n = nums.size();
if (n == 0)
{
return 0;
}
int fast = 1, slow = 1;
while (fast < n)
{
if (nums[fast] != nums[fast - 1])
{
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
};

思路

很有意思的快慢指针

  1. 若数组长度为0(空数组),则返回0
  2. 新建一对快慢指针,都从1开始(第二个元素)
  3. fast指针每次遍历都加一
  4. 如果fast指针遇到了当前元素和前一个元素不相等,用这个值替换slow指针所在位置的值,同时slow指针加一

简单来说,你可以理解为数组在遍历的过程中每遇到新元素就把它添加到一个新的数组里去,只不过这里限制了必需通过修改nums的方式来实现(使用O(1)的额外空间)。所以只能覆盖了。

当然,这里还有一个重要的前提就是有序,你可以把它当作可以考虑使用快慢指针的关键词